﻿using System;
using System.Xml.Linq;
using CPN.PJN.Silverlight.Common.Logging;

namespace CPN.PJN.Silverlight.Common.ExceptionHandling.Handlers
{
    /// <summary>
    /// Cette classe représente le gestionnaire pour logger les exceptions
    /// </summary>
    public class LoggerExceptionHandler : ExceptionHandler
    {
        #region CategoryName Property

        /// <summary>
        /// Categorie de log pour les exceptions
        /// </summary>
        public string CategoryName { get; private set; } 

        #endregion

        #region HandleException Method

        /// <summary>
        /// Permet d'exécuter la gestion de l'exception
        /// </summary>
        /// <param name="exceptionToHandle">Exception récupérée</param>
        /// <param name="data">Données de l'exception</param>
        public override void HandleException(Exception exceptionToHandle, params object[] data)
        {
            try
            {
                if (this.Formatter != null && !String.IsNullOrEmpty(this.CategoryName))
                {
                    Logger.Instance.Write(this.Formatter.Format(exceptionToHandle, data), this.CategoryName, LogSeverity.Error);
                }
            }
            catch (Exception)
            {

            }
        }

        #endregion

        #region Configure Method
        
        /// <summary>
        /// Cette méthode permet de configurer le Formatter
        /// </summary>
        /// <param name="configurationElement">Element Formatter</param>
        public override void Configure(XElement configurationElement)
        {
            if (configurationElement.Attribute("formatterType") != null)
            {
                var nameType = configurationElement.Attribute("formatterType").Value;
                var type = Type.GetType(nameType);
                if (type != null)
                {
                    this.Formatter = Activator.CreateInstance(type) as ExceptionFormatter;
                }
            }
            if (configurationElement.Attribute("categoryName") != null)
            {
                this.CategoryName = configurationElement.Attribute("categoryName").Value;
            }
            else
            {
                this.CategoryName = Logger.DEFAULT_CATEGORY;
            }
        } 

        #endregion
    }
}
